#!/usr/bin/perl

use FindBin qw($Bin);
use lib $Bin;
use ResultadosGlobales;
use ResultadosDetallados;
use warnings;

#==============================================================================
%config = leerConfiguracion();
$rutaDeReporte = generarRutaDeReporte();

if ('-h' ~~ @ARGV) {
    mostrarAyuda();
} elsif ('-r' ~~ @ARGV && !('-g' ~~ @ARGV)) {
    if ('-x' ~~ @ARGV) {
        pedirFiltrosParaConsultaDetallada(1);
    } else {
        pedirFiltrosParaConsultaDetallada(0);
    }
} elsif (!('-r' ~~ @ARGV)) {
    if ('-x' ~~ @ARGV) { 
        pedirFiltrosParaConsultaGlobal(1);
    } else {
        pedirFiltrosParaConsultaGlobal(0);
    }
} else {
    print "Las opciones -g y -r son mutuamente excluyentes\n";
    mostrarAyuda();
}

#==============================================================================
sub mostrarAyuda {
    print "Modo de uso:\n";
    print "    ./ListarW5.pl [OPCIONES]\n\n";
    print "Opciones:\n";
    print "    -h      Muestra este mensaje de ayuda.\n";
    print "    -g      Resuelve consultas sobre cantidad de hallazgos en resultados globales.\n";
    print "            No puede usarse junto a -r\n";
    print "    -r      Lista resultados extraidos de los archivos de resultados detallados.\n";
    print "            No puede usarse junto a -g\n";
    print "    -x      Ademas de imprimir en pantalla, se guardan los resultados en el\n";
    print "            directorio de reportes\n";
}

#==============================================================================
sub leerConfiguracion {
    %configuracion = ();
    $ruta = "~/.grupo08/InstalaW5.conf";
    @rutaGlobeada = glob($ruta);
    
    open(ARCHIVO, "<$rutaGlobeada[0]") or die $!;
    
    while ($linea = <ARCHIVO>) {
        @campos = split("=", $linea);
        chomp($campos[1]);
        $configuracion{$campos[0]} = $campos[1];
    }
    
    close(ARCHIVO);
    return %configuracion;
}

#==============================================================================
sub generarRutaDeReporte {
    $ruta = $config{'REPODIR'};
    @rutaGlobeada = glob($ruta);
    $ruta = $rutaGlobeada[0];
    
    $i = 1;
    while (-f $ruta . "/salida_$i") {
        $i++;
    }
    return $ruta . "/salida_$i";
}

#==============================================================================
sub emitirLineaDeSalida {
    ($linea, $grabarEnReporte) = @_;
    
    print "$linea\n";
    if ($grabarEnReporte) {
        open(ARCHIVO, ">>$rutaDeReporte");
        print ARCHIVO "$linea\n";
        close(ARCHIVO);
    }
}

#==============================================================================
sub leerArchivoDePatrones {
    (@sistemasElegidos) = @_;
    
    %patrones = ();
    
    @directorioGlobeado = glob($config{'MAEDIR'});
    $ruta = $directorioGlobeado[0] . '/patrones';
    
    open(ARCHIVO, "<$ruta");
    
    while ($linea = <ARCHIVO>) {
        @campos = split(",", $linea);
        if (($campos[2] ~~ @sistemasElegidos) || (@sistemasElegidos == 0 )) {
            $patrones{$campos[0]} = $campos[1];
        }
    }
    
    close(ARCHIVO);
    return %patrones;
}

#==============================================================================
sub leerArchivoDeSistemas {
    %sistemas = ();
    
    @directorioGlobeado = glob($config{'MAEDIR'});
    $ruta = $directorioGlobeado[0] . '/sistemas';
    
    open(ARCHIVO, "<$ruta");
    
    while ($linea = <ARCHIVO>) {
        @campos = split(",", $linea);
        $sistemas{$campos[0]} = $campos[1];
    }
    
    close(ARCHIVO);
    return %sistemas;
}

#==============================================================================
sub obtenerNombresDeArchivosProcesados {
    (@sistemasElegidos) = @_;

    @directorioGlobeado = glob($config{'PROCDIR'});
    $ruta = $directorioGlobeado[0];

    @contenidos = ();
    if (@sistemasElegidos == 0) {
        @contenidos = glob($ruta . '/*');
    } else {
        foreach (@sistemasElegidos) {
            @contenidos = (@contenidos, glob($ruta . '/' . $_ . '*'));
        }
    }

    @contenidos = map { @partes = split('/', $_); $partes[@partes - 1] } @contenidos;
    @contenidos = map { $_ =~ /^rglobales\..+$/ ? () : $_ } @contenidos;
    @contenidos = map { $_ =~ /^resultados\..+$/ ? () : $_ } @contenidos;
    return @contenidos;
}

#==============================================================================
sub obtenerRutasDeArchivosDeResultadosDetallados {
    @directorioGlobeado = glob($config{'PROCDIR'});
    $ruta = $directorioGlobeado[0];

    @contenidos = glob($ruta . '/resultados.*');
    return @contenidos;
}

#==============================================================================
sub obtenerRutaDeArchivoProcesadoPorIdDePatron {
    ($idPatron) = @_;
    @directorioGlobeado = glob($config{'PROCDIR'});
    $ruta = $directorioGlobeado[0];    
    return $ruta . '/rglobales.' . $idPatron;
}

#==============================================================================
sub mostrarLista {
    (%patrones) = @_;
    foreach $k (sort(keys(%patrones))) {
        $patron = $patrones{$k};
        print "\e[1m$k\e[0m) $patron\n";
    }
}

#==============================================================================
sub pedirNumero {
    ($texto) = @_;
    $dato = pedirCadena($texto);
    
    if (!($dato =~ /^\d+$/) && $dato ne '') {
        print "Por favor ingrese un entero valido.\n";
        return pedirNumero($texto);
    }
    return $dato;
}

#==============================================================================
sub pedirCadena {
    ($texto) = @_;
    print "$texto ";
    $dato = <STDIN>;
    chomp($dato);
    
    return $dato;
}
